<?php
declare (strict_types = 1);

namespace app\middleware;

use app\model\User;
use think\facade\Request;
use think\Response;

/**
 * 用户认证中间件
 */
class Auth
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        // 先检查文件是否存在，如果存在的话添加简单的日志记录功能
        if(method_exists($this, 'handle')) {
            \think\facade\Log::info('Auth中间件被调用');
        }
        
        // 获取请求头中的Token
        $token = $request->header('Authorization');
        
        if (!$token) {
            return json([
                'code' => 401,
                'msg' => '请先登录',
                'data' => [],
                'timestamp' => time()
            ], 401);
        }
        
        // 解析Token，实际项目中应使用JWT或其他Token验证方式
        $tokenData = $this->parseToken($token);
        if (!$tokenData || !isset($tokenData['openid'])) {
            return json([
                'code' => 401,
                'msg' => '无效的登录凭证',
                'data' => [],
                'timestamp' => time()
            ], 401);
        }
    
        // 查找用户
        $user = User::where('openid', $tokenData['openid'])->find();
       
        if (!$user) {
            return json([
                'code' => 401,
                'msg' => '用户不存在或已被禁用',
                'data' => [],
                'timestamp' => time()
            ], 401);
        }
        
        // 用户状态检查
        if ($user->status != 1) {
            return json([
                'code' => 401,
                'msg' => '账号已被禁用',
                'data' => [],
                'timestamp' => time()
            ], 403);
        }
        
        // 将用户ID存储在session中，而不仅仅是绑定到Request对象
        $request->userId = $user->id;
        
        // 使用全局单例 Request 对象
        request()->userId = $user->id;
        session('user_id', $user->id);
        
        // 确保用户对象能够正确传递
        $request->withUserObject = true;
        app()->bind('user_id', $user->id);
        
        // 调试输出
        trace("Auth中间件设置用户: " . json_encode($user->toArray(), JSON_UNESCAPED_UNICODE), 'debug');
        
        return $next($request);
    }
    
    /**
     * 解析Token
     *
     * @param string $token
     * @return array|null
     */
    protected function parseToken(string $token)
    {
        // 去除Bearer前缀
        if (strpos($token, 'Bearer ') === 0) {
            $token = substr($token, 7);
        }
        
        // 实际项目中应该使用JWT或其他方式解析Token
        // 这里简单示例，将base64编码的字符串解码并转为数组
        try {
            $payload = base64_decode($token);
            return json_decode($payload, true);
        } catch (\Exception $e) {
            return null;
        }
    }
} 